package com.demo.java.OD151_200.OD185;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【不等式 or 约束条件下的最大差】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145864329
 */
public class OdMain {
    // 常量，表示无效的IP
    private static final String INVALID_IP = "invalid IP";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取输入的各行
        String input = scanner.nextLine();
        String[] expressions = input.split(";");

        // 记录最大误差
        double maxError = 0;

        // 获取约束条件，目标值等
        String[] limits = expressions[expressions.length - 1].split(",");
        String[] aims = expressions[expressions.length - 2].split(",");
        String[] vars = expressions[expressions.length - 3].split(",");

        // 对每个表达式进行处理
        for (int i = 0; i < limits.length; ++i) {
            String[] terms = expressions[i].split(",");
            List<Double> termList = new ArrayList<>();

            // 将每个表达式的系数存入termList
            for (String s : terms) {
                termList.add(Double.parseDouble(s));
            }

            // 计算该表达式的值
            double value = calculateValue(termList, vars);

            // 获取目标值
            double aim = Double.parseDouble(aims[i]);

            // 计算误差
            double error = Math.abs(value - aim);
            maxError = Math.max(maxError, error);

            // 检查是否满足约束条件
            if (!checkLimit(limits[i], value, aim)) {
                // 如果不满足条件，输出错误
                System.out.println("false " + (int) maxError);
                return;
            }
        }

        // 如果都满足条件，输出结果
        System.out.println("true " + (int) maxError);
    }

    // 计算表达式的值
    private static double calculateValue(List<Double> terms, String[] vars) {
        double value = 0;
        for (int i = 0; i < terms.size(); i++) {
            value += terms.get(i) * Integer.parseInt(vars[i]);
        }
        return value;
    }

    // 检查是否满足约束条件
    private static boolean checkLimit(String limit, double value, double aim) {
        switch (limit) {
            case ">":
                return value > aim;
            case "<":
                return value < aim;
            case ">=":
                return value >= aim;
            case "<=":
                return value <= aim;
            default:
                return false;
        }
    }
}